From: Luca Bacci Date: Fri, 10 Feb 2023 20:32:29 +0000 (+0100) Subject: GdkWin32: Correct generation of crossing events when holding an implicit grab X-Git-Tag: archive/raspbian/3.24.39-1+rpi1~1^2~65^2~1^2~8^2~1 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=783af2e3bf432ba18bd675eb0c094db585e67c4e;p=gtk%2B3.0.git GdkWin32: Correct generation of crossing events when holding an implicit grab This is a backport of commit 91f20016 to gtk-3-24 --- diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index b4c78abe18..1c942af40a 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -2739,60 +2739,35 @@ gdk_event_translate (MSG *msg, pen_touch_input = FALSE; - new_window = window; - - if (pointer_grab != NULL) - { - POINT pt; - pt = msg->pt; - - new_window = NULL; - hwnd = WindowFromPoint (pt); - if (hwnd != NULL) - { - POINT client_pt = pt; - - ScreenToClient (hwnd, &client_pt); - GetClientRect (hwnd, &rect); - if (PtInRect (&rect, client_pt)) - new_window = gdk_win32_handle_table_lookup (hwnd); - } - - if (!pointer_grab->owner_events && - new_window != NULL && - new_window != pointer_grab->native_window) - new_window = NULL; - } + g_set_object (&window, find_window_for_mouse_event (window, msg)); - if (mouse_window != new_window) + if (mouse_window != window) { GDK_NOTE (EVENTS, g_print (" mouse_window %p -> %p", mouse_window ? GDK_WINDOW_HWND (mouse_window) : NULL, - new_window ? GDK_WINDOW_HWND (new_window) : NULL)); + window ? GDK_WINDOW_HWND (window) : NULL)); synthesize_crossing_events (display, device_manager_win32->system_pointer, - mouse_window, new_window, + mouse_window, window, GDK_CROSSING_NORMAL, &msg->pt, 0, /* TODO: Set right mask */ _gdk_win32_get_next_tick (msg->time), FALSE); - g_set_object (&mouse_window, new_window); + g_set_object (&mouse_window, window); mouse_window_ignored_leave = NULL; - if (new_window != NULL) - track_mouse_event (TME_LEAVE, GDK_WINDOW_HWND (new_window)); + if (window != NULL) + track_mouse_event (TME_LEAVE, GDK_WINDOW_HWND (window)); } - else if (new_window != NULL && - new_window == mouse_window_ignored_leave) + else if (window != NULL && window == mouse_window_ignored_leave) { /* If we ignored a leave event for this window and we're now getting input again we need to re-arm the mouse tracking, as that was cancelled by the mouseleave. */ mouse_window_ignored_leave = NULL; - track_mouse_event (TME_LEAVE, GDK_WINDOW_HWND (new_window)); + track_mouse_event (TME_LEAVE, GDK_WINDOW_HWND (window)); } - g_set_object (&window, find_window_for_mouse_event (window, msg)); impl = GDK_WINDOW_IMPL_WIN32 (window->impl); /* If we haven't moved, don't create any GDK event. Windows